package com.yhm.pagination;


import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.log4j.Logger;
/**
 * 分页标签 *
 * @author 杨华明
 * @date 2012.9.28
 *       2013.7.3 修改第2版
 */
public class PageTag extends TagSupport {
	private static final long serialVersionUID = 7242423813230124088L;
	private Logger logger=Logger.getLogger(getClass());
	/**对应标签的属性*/
	private Integer totalCount=0;
	private Integer currentPage=1;
	private Integer pageSize=1;
	
	private String name="";//分页标签的属性名称
	private String includes="";	//get传递参数的，以逗号隔开
	private String pagerForm="";//post传递参数时使用的查询表单名称
	private Integer seaJS=0;    //是否使用seaJs包装.缺省不使用.直接使用Jquery	
	
	private String pagerUrl;//分页a标签转发的地址,其中分页currentPage参数值必须用占位符%s
	/**总记录数*/
	public Integer getTotalCount() {
		return totalCount==null||totalCount<0?0:totalCount;
	}
	/**总记录数*/
	public void setTotalCount(Integer totalCount) {
		this.totalCount = totalCount==null||totalCount<0?0:totalCount;
	}
	/**当前要显示的页号*/
	public Integer getCurrentPage() {
		return currentPage==null||currentPage<1?1:currentPage;
	}
	/**当前要显示的页号*/
	public void setCurrentPage(Integer currentPage) {
		this.currentPage = currentPage==null||currentPage<1?1:currentPage;;
	}
	/**每页显示记录条数*/
	public Integer getPageSize() {
		return pageSize==null||pageSize<1?1:pageSize;
	}
	/**每页显示记录条数*/
	public void setPageSize(Integer pageSize) {
		this.pageSize = pageSize==null||pageSize<1?1:pageSize;;
	}
	/**需要传递的属性*/
	public void setIncludes(String includes) {
		this.includes = includes==null?"":includes;
	}
	/**需要传递的属性*/
	public  String getIncludes() {
		return includes==null?"":includes;
	}
	/**分页对象的名称.作为分页参数的前缀比如，
	 * 当name=page时应传递:page.currentPage*/
	public String getName() {
		return (name!=null&&name.trim().length()>0)?name+".":"";
	}
	/**分页对象的名称.作为分页参数的前缀比如，
	 * 当name=page时应传递:page.currentPage*/
	public void setName(String name) {
		this.name = name==null?"":name;
	}
	@Override
	public String toString() {
		return "PageTag [totalCount=" + totalCount
				+ ", currentPage=" + currentPage + ", pageSize=" + pageSize
				+ ", name=" + name + ", includes="
				+ includes + "]";
	}
	/**页面传递过来的。用户生成的提交的表单的名字
    * 如果为空则通过a标签提交*/
	public String getPagerForm() {
		return pagerForm==null?"":pagerForm;
	}
	/**页面传递过来的。用户生成的提交的表单的名字
	 * * 如果为空则通过a标签提交*/
	public void setPagerForm(String pagerForm) {
		this.pagerForm = pagerForm==null?"":pagerForm;
	}
	/**Jquery是否使用seajs包装0，不使用，1使用*/
	public Integer getSeaJS() {
		return seaJS==null?0:seaJS;
	}
	/**Jquery是否使用seajs包装0，不使用，1使用*/
	public void setSeaJS(Integer seaJS) {
		this.seaJS = seaJS;
	}
	/**分页a标签上的连接:pagerForm和pagerUrl属性至少有一个不能为空.如果都不为空,将以pagerForm为准 */
	public String getPagerUrl() {
		return pagerUrl==null?"":pagerUrl;
	}
	/**分页a标签上的连接:pagerForm和pagerUrl属性至少有一个不能为空.如果都不为空,将以pagerForm为准 */
	public void setPagerUrl(String pagerUrl) {
		this.pagerUrl = pagerUrl;
	}
	/**检查属性设置是否正常:PagerForm和PagerUrl属性只能有一个，有PagerForm的话PagerUrl将无效*/
	private boolean checkParam(){
		if(getPagerForm()!=null&&getPagerForm().length()>0){
			setPagerUrl("");
			return true;
		}else{
			return (getPagerUrl()!=null&&getPagerUrl().length()>0); 
		}
	}
	@Override
	public int doEndTag() throws JspException {
		JspWriter out = pageContext.getOut();
		try {
			if(!checkParam()) throw new RuntimeException("属性设置错误:pagerForm和pagerUrl属性必须有一个不能为空");
			String url="";
			if(getPagerUrl()!=null&&getPagerUrl().length()>0){
				url=getPagerUrl();
			}else {
				url=(String)pageContext.getRequest().getAttribute("javax.servlet.forward.request_uri");
			}
			PageTagUtil pageTagUtil=new PageTagUtil(new PageUtil(totalCount, currentPage, pageSize), getPagerUrl(), getPagerForm(), getIncludes(), getSeaJS(),getName());
			out.print(pageTagUtil.getTools3(url));
		} catch (Exception e) {
			logger.debug("生成标签异常",e);
		}
		return super.doEndTag();
	}	
}